import request from '@/utils/request'
import * as qiniu from 'qiniu-js'


export function getToken() {
  return {
    qiniuGetToken: '/qiniu/getToken'
  }
}

export function client() {
  var config = {
    str: "abcdefg",
    // bucket 所在区域。ECN, SCN, NCN, NA, ASG，分别对应七牛云的：华东，华南，华北，北美，新加坡 5 个区域
    qiniuRegion: '',
    // 七牛云bucket 外链前缀，外链在下载资源时用到
    qiniuBucketURLPrefix: '',

    // 获取uptoken方法三选一即可，执行优先级为：uptoken > uptokenURL > uptokenFunc。三选一，剩下两个置空。推荐使用uptokenURL，详情请见 README.md
    // 由其他程序生成七牛云uptoken，然后直接写入uptoken
    qiniuUploadToken: '',
    // 从指定 url 通过 HTTP GET 获取 uptoken，返回的格式必须是 json 且包含 uptoken 字段，例如： {"uptoken": "0MLvWPnyy..."}
    qiniuUploadTokenURL: request.baseURL + getToken().qiniuGetToken,
    // uptokenFunc 这个属性的值可以是一个用来生成uptoken的函数，详情请见 
    qiniuUploadTokenFunction: function () { },
    // qiniuShouldUseQiniuFileName 如果是 true，则文件的 key 由 qiniu 服务器分配（全局去重）。如果是 false，则文件的 key 使用微信自动生成的 filename。出于初代sdk用户升级后兼容问题的考虑，默认是 false。
    // 微信自动生成的 filename较长，导致fileURL较长。推荐使用{qiniuShouldUseQiniuFileName: true} + "通过fileURL下载文件时，自定义下载名" 的组合方式。
    // 自定义上传key 需要两个条件：1. 此处shouldUseQiniuFileName值为false。 2. 通过修改qiniuUploader.upload方法传入的options参数，可以进行自定义key。（请不要直接在sdk中修改options参数，修改方法请见demo的index.js）
    // 通过fileURL下载文件时，自定义下载名，请参考：七牛云“对象存储 > 产品手册 > 下载资源 > 下载设置 > 自定义资源下载名”（https://developer.qiniu.com/kodo/manual/1659/download-setting）。本sdk在README.md的"常见问题"板块中，有"通过fileURL下载文件时，自定义下载名"使用样例。
    qiniuShouldUseQiniuFileName: false
  }

  function init() {
    return request.get(getToken().qiniuGetToken).then(updateConfigWithOptions)
  }
  function updateConfigWithOptions(options) {
    if (options.upload_qiniu_url) {
      config.qiniuRegion = options.upload_qiniu_url
    }
    if (options.upload_qiniu_addr) {
      config.qiniuBucketURLPrefix = options.upload_qiniu_addr
    }
    if (options.uptoken) {
      config.qiniuUploadToken = options.uptoken
    }

  }



  function upload(file, progress) {
    if (null == file) {
      console.error('qiniu uploader need filePath to upload');
      return;
    }
    if (!config.qiniuUploadToken) {
      return init().then(res => {
        return upload(file, progress)
      })
    }
    let key = getKey()
    return new Promise((resolve, reject) => {
      const isTrue = false;
      var qiniuconfig = {
        useCdnDomain: true,
        disableStatisticsReport: false,
        retryCount: 6,
        region: qiniu.region.z1
      };
      var putExtra = {
        fname: "",
        params: {},
        mimeType: null
      };
      const observable = qiniu.upload(file, key, config.qiniuUploadToken, putExtra, qiniuconfig)

      // or
      const subscription = observable.subscribe(res => {
        progress && progress(res.total.percent)
      }, res => { }, res => {
        let url = config.qiniuBucketURLPrefix + res.key
        console.log(url)
        resolve(url)
      }) // 这样传参形式也可以
      if (isTrue)
        subscription.unsubscribe() // 上传取消
    })






  }
  function getKey() {

    function randomStr(str, num) {
      let arr = [...str]
      let tmp = []
      for (let index = 0; index < index + 1; index++) {
        tmp.push(arr[Math.floor(Math.random() * arr.length)])
        if ([...new Set(tmp)].length == num) {
          return [...new Set(tmp)].join('')
          break;
        }
      }
    }
    var str = ''
    for (let i = 65; i <= 90; i++) {
      str += String.fromCharCode(i)
    }
    return randomStr(str, 15)
  }


  return {
    upload,
    init,
  }
}
